#!/bin/bash

# 设置颜色输出
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
RED='\033[0;31m'
NC='\033[0m' # No Color

# 获取脚本所在目录的绝对路径
SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"

# 输出带颜色的信息
info() {
    echo -e "${GREEN}[INFO]${NC} $1"
}

warn() {
    echo -e "${YELLOW}[WARN]${NC} $1"
}

error() {
    echo -e "${RED}[ERROR]${NC} $1"
}

# 检查端口是否被占用（CentOS 7可能没有lsof，使用ss命令替代）
check_port() {
    local port=$1
    if ss -tuln | grep -q ":$port "; then
        return 0 # 端口被占用
    else
        return 1 # 端口未被占用
    fi
}

# 检查进程是否在运行
check_process() {
    local name=$1
    if pgrep -f "$name" > /dev/null; then
        return 0 # 进程在运行
    else
        return 1 # 进程未运行
    fi
}

# 启动前端服务
start_frontend() {
    info "正在检查前端服务状态..."
    
    if check_port 5173; then
        warn "前端服务端口(5173)已被占用"
        local pid=$(ss -tuln | grep ":5173 " | awk '{print $6}' | cut -d ":" -f 2)
        if [ ! -z "$pid" ]; then
            warn "正在停止已存在的前端服务(PID: $pid)..."
            kill $pid
            sleep 2
        fi
    fi
    
    info "正在启动前端服务..."
    cd "${SCRIPT_DIR}/frontend"
    if [ ! -f "package.json" ]; then
        error "找不到前端项目的 package.json 文件，请确保在正确的目录下运行脚本"
        exit 1
    fi
    
    # 检查是否需要安装依赖
    if [ ! -d "node_modules" ]; then
        info "正在安装前端依赖..."
        npm install
    fi
    
    nohup npm run dev > frontend.log 2>&1 &
    
    # 等待服务启动
    local count=0
    while ! check_port 5173 && [ $count -lt 30 ]; do
        sleep 1
        count=$((count + 1))
    done
    
    if check_port 5173; then
        info "前端服务已启动成功 (http://localhost:5173)"
    else
        error "前端服务启动失败，请检查frontend.log文件"
        exit 1
    fi
}

# 启动后端服务
start_backend() {
    info "正在检查后端服务状态..."
    
    if check_port 8080; then
        warn "后端服务端口(8080)已被占用"
        local pid=$(ss -tuln | grep ":8080 " | awk '{print $6}' | cut -d ":" -f 2)
        if [ ! -z "$pid" ]; then
            warn "正在停止已存在的后端服务(PID: $pid)..."
            kill $pid
            sleep 2
        fi
    fi
    
    info "正在启动后端服务..."
    cd "${SCRIPT_DIR}/backend"
    if [ ! -f "main.go" ]; then
        error "找不到后端项目的 main.go 文件，请确保在正确的目录下运行脚本"
        exit 1
    fi
    
    # 确保CGO_ENABLED=1，因为使用了SQLite
    export CGO_ENABLED=1
    nohup go run main.go > backend.log 2>&1 &
    
    # 等待服务启动
    local count=0
    while ! check_port 8080 && [ $count -lt 30 ]; do
        sleep 1
        count=$((count + 1))
    done
    
    if check_port 8080; then
        info "后端服务已启动成功 (http://localhost:8080)"
    else
        error "后端服务启动失败，请检查backend.log文件"
        exit 1
    fi
}

# 主函数
main() {
    # 确保在项目根目录
    if [ ! -d "${SCRIPT_DIR}/frontend" ] || [ ! -d "${SCRIPT_DIR}/backend" ]; then
        error "找不到前端或后端目录，请确保脚本在项目根目录下运行"
        exit 1
    fi
    
    info "开始启动排班系统服务..."
    info "项目根目录: ${SCRIPT_DIR}"
    
    # 安装必要的系统工具
    if ! command -v ss &> /dev/null; then
        info "正在安装必要的系统工具..."
        sudo yum install -y iproute
    fi
    
    # 启动后端服务
    start_backend
    
    # 启动前端服务
    start_frontend
    
    info "所有服务已启动完成！"
    info "前端服务: http://localhost:5173"
    info "后端服务: http://localhost:8080"
    info "日志文件:"
    info "- 前端: ${SCRIPT_DIR}/frontend/frontend.log"
    info "- 后端: ${SCRIPT_DIR}/backend/backend.log"
}

# 运行主函数
main